/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package traspasos.beans;

import datamodel.EntidadesElegidasDataModel;
import entities.EnvioTraspasoMercancia;
import entities.LineaEnvioTraspasoMercancia;
import entities.LineaPeticionTraspasoMercancia;
import entities.Usuario;
import facades.AlmacenFacade;
import facades.EnvioTraspasoMercanciaFacade;
import facades.LineaEnvioTraspasoMercanciaFacade;
import facades.LineaPeticionTraspasoMercanciaFacade;
import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;
import javax.enterprise.event.Event;
import javax.enterprise.event.Observes;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import qualifiers.EventoEntidadCreada;
import qualifiers.EventoEntidadesElegidas;
import qualifiers.UsuarioLogeado;
import traspasos.qualifiers.EventoPeticionNoSatisfecha;

/**
 *
 * @author damfercer
 */
@Named(value = "nuevoEnvioTraspasoMercanciaBean")
@SessionScoped
public class NuevoEnvioTraspasoMercanciaBean implements Serializable {
    private EnvioTraspasoMercancia nuevoEnvio;
    private List<LineaEnvioTraspasoMercancia> lineasEnvioTraspasoMercancia;
    @Inject
    @UsuarioLogeado
    Usuario usuario;
    @Inject
    EnvioTraspasoMercanciaFacade envioTraspasoMercanciaFacade;
    @Inject
    LineaEnvioTraspasoMercanciaFacade lineaEnvioTraspasoMercanciaFacade;
    @Inject
    LineaPeticionTraspasoMercanciaFacade lineaPeticionTraspasoMercanciaFacade;
    @Inject
    @EventoPeticionNoSatisfecha
    Event<LineaEnvioTraspasoMercancia> eventoPeticionNoSatisfecha;
    @Inject
    @EventoEntidadCreada
    Event<LineaEnvioTraspasoMercancia> eventoNuevaLineaEnvio;
    @Inject
    @EventoEntidadCreada
    Event<EnvioTraspasoMercancia> eventoNuevoEnvio;
    @Inject
    AlmacenFacade almacenFacade;
    /**
     * Creates a new instance of NuevoEnvioTraspasoMercanciaBean
     */
    public NuevoEnvioTraspasoMercanciaBean() {
    }

    /**
     * @return the nuevoEnvio
     */
    public EnvioTraspasoMercancia getNuevoEnvio() {
        return nuevoEnvio;
    }

    /**
     * @param nuevoEnvio the nuevoEnvio to set
     */
    public void setNuevoEnvio(EnvioTraspasoMercancia nuevoEnvio) {
        this.nuevoEnvio = nuevoEnvio;
    }

    /**
     * @return the lineasEnvioTraspasoMercancia
     */
    public List<LineaEnvioTraspasoMercancia> getLineasEnvioTraspasoMercancia() {
        return lineasEnvioTraspasoMercancia;
    }

    /**
     * @param lineasEnvioTraspasoMercancia the lineasEnvioTraspasoMercancia to set
     */
    public void setLineasEnvioTraspasoMercancia(List<LineaEnvioTraspasoMercancia> lineasEnvioTraspasoMercancia) {
        this.lineasEnvioTraspasoMercancia = lineasEnvioTraspasoMercancia;
    }
    
    public void onLineasPeticionPendientesElegidas(@Observes @EventoEntidadesElegidas EntidadesElegidasDataModel dataModel){
        if(dataModel.getEntidadesElegidas().iterator().next().getClass().equals(LineaPeticionTraspasoMercancia.class)){
            lineasEnvioTraspasoMercancia=new ArrayList<LineaEnvioTraspasoMercancia>();
            nuevoEnvio=new EnvioTraspasoMercancia();
            LineaPeticionTraspasoMercancia lineaPeticion=(LineaPeticionTraspasoMercancia)dataModel.getEntidadesElegidas().iterator().next();
            nuevoEnvio.setAlmacenDestino(lineaPeticion.getPeticionTraspasoMercancia().getAlmacen());
            nuevoEnvio.setAlmacenEnvio(lineaPeticion.getAlmacenEnvio());
            for (Object lineaPeticionTraspasoMercancia : dataModel.getEntidadesElegidas()) {
                LineaPeticionTraspasoMercancia lineaPeticionTraspasoMercanciaCasted=(LineaPeticionTraspasoMercancia)lineaPeticionTraspasoMercancia;
                LineaEnvioTraspasoMercancia lineaEnvio=new LineaEnvioTraspasoMercancia();
                lineaEnvio.setCantidad(0);
                lineaEnvio.setLineaPeticionTraspasoMercancia(lineaPeticionTraspasoMercanciaCasted);
                lineaEnvio.setProductoTalla(lineaPeticionTraspasoMercanciaCasted.getProductoTalla());
                lineasEnvioTraspasoMercancia.add(lineaEnvio);
            }
        }
    }
    
    public String guardar(){
        nuevoEnvio.setUsuarioCreador(usuario);
        nuevoEnvio.setFechaCreacion(new Date());
        envioTraspasoMercanciaFacade.create(nuevoEnvio);
        for (LineaEnvioTraspasoMercancia lineaEnvioTraspasoMercancia : lineasEnvioTraspasoMercancia) {
            if(lineaEnvioTraspasoMercancia.getCantidad()>0){
                lineaEnvioTraspasoMercancia.setEnvioTraspasoMercancia(nuevoEnvio);
                if(lineaEnvioTraspasoMercancia.getCantidad()<lineaEnvioTraspasoMercancia.getLineaPeticionTraspasoMercancia().getCantidad()){
                    eventoPeticionNoSatisfecha.fire(lineaEnvioTraspasoMercancia);
                    lineaEnvioTraspasoMercancia.getLineaPeticionTraspasoMercancia().setCantidad(lineaEnvioTraspasoMercancia.getCantidad());
                    lineaPeticionTraspasoMercanciaFacade.edit(lineaEnvioTraspasoMercancia.getLineaPeticionTraspasoMercancia());
                }
                lineaEnvioTraspasoMercanciaFacade.create(lineaEnvioTraspasoMercancia);
                eventoNuevaLineaEnvio.fire(lineaEnvioTraspasoMercancia);
                if(nuevoEnvio.getLineaEnvioTraspasoMercanciaList()==null){
                    nuevoEnvio.setLineaEnvioTraspasoMercanciaList(new ArrayList<LineaEnvioTraspasoMercancia>());
                }
                nuevoEnvio.getLineaEnvioTraspasoMercanciaList().add(lineaEnvioTraspasoMercancia);
            }
        }
        envioTraspasoMercanciaFacade.evict(nuevoEnvio, nuevoEnvio.getIdEnvioTraspasoMercancia());
        eventoNuevoEnvio.fire(nuevoEnvio);
        return "/views/tienda/EnviosTraspasoMercanciaRealizados?faces-redirect=true";
    }
    
    public void onChange(LineaEnvioTraspasoMercancia linea){
        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletRequest request = (HttpServletRequest)context.getExternalContext().getRequest();
        Locale locale=context.getViewRoot().getLocale();
        ResourceBundle rb = ResourceBundle.getBundle("messages", locale);
            
        if(linea.getCantidad()<=0){
            if(estanTodasLasLineasVacias()){
                String errorTodasLineasEnvioVacias=rb.getString("ErrorTodasLineasEnvioVacias");
                FacesMessage msg =new FacesMessage(errorTodasLineasEnvioVacias,errorTodasLineasEnvioVacias);
                msg.setSeverity(FacesMessage.SEVERITY_ERROR);
                context.addMessage(null, msg);
                context.renderResponse();
            }
        }
        else if(linea.getCantidad()>linea.getLineaPeticionTraspasoMercancia().getCantidad()){
            String errorSuperarCantidad=rb.getString("ErrorCantidadSuperada");
            FacesMessage msg =new FacesMessage(errorSuperarCantidad,errorSuperarCantidad);
            msg.setSeverity(FacesMessage.SEVERITY_ERROR);
            context.addMessage(null, msg);
            context.renderResponse();
        }
        else if(linea.getCantidad()<linea.getLineaPeticionTraspasoMercancia().getCantidad()){
            String warningIncidencia=rb.getString("ErrorIncidenciaEnvio");
            FacesMessage msg =new FacesMessage(warningIncidencia,warningIncidencia);
            msg.setSeverity(FacesMessage.SEVERITY_WARN);
            context.addMessage(null, msg);
            context.renderResponse();
        }
    }
    
    public Boolean getPuedeGuardar(){
        Boolean puedeGuardar=!estanTodasLasLineasVacias() && ningunaLineaSuperaLaCantidad();
        return puedeGuardar;
    }
    
    private Boolean estanTodasLasLineasVacias(){
        Boolean todasVacias=true;
        for (LineaEnvioTraspasoMercancia lineaEnvioTraspasoMercancia : lineasEnvioTraspasoMercancia) {
            if(lineaEnvioTraspasoMercancia.getCantidad()!=0){
                todasVacias=false;
            }
            if(!todasVacias){
                break;
            }
        }
        return todasVacias;
    }
    
    private Boolean ningunaLineaSuperaLaCantidad(){
        Boolean ningunaSupera=true;
        for (LineaEnvioTraspasoMercancia lineaEnvioTraspasoMercancia : lineasEnvioTraspasoMercancia) {
            if(lineaEnvioTraspasoMercancia.getCantidad()>lineaEnvioTraspasoMercancia.getLineaPeticionTraspasoMercancia().getCantidad()){
                ningunaSupera=false;
            }
            if(!ningunaSupera){
                break;
            }
        }
        return ningunaSupera;
    }
}
